#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <getopt.h>
#include "mystat.h"

#define SIZE 128

int main(int argc, char **argv) 
{
    int ch;
    static struct option long_opts[] = {
        { "version", no_argument, NULL, 'v' },
        { "help", no_argument, NULL, 'h' },
        { 0, 0, 0, 0 }
    };


    /**
     * getopt_long() 解析命令行参数（支持长选项和短选项）。
     *
     * @param argc      命令行参数的数量，通常直接传递 main 函数的 argc。
     * @param argv      命令行参数的数组，通常直接传递 main 函数的 argv。
     * @param optstring 短选项字符串，用于定义支持的短选项。
     *                  - 单个字符表示一个选项（如 "a" 表示 -a）。
     *                  - 字符后跟冒号表示该选项需要一个参数（如 "a:" 表示 -a 需要参数）。
     *                  - 字符后跟两个冒号表示该选项的参数是可选的（如 "a::" 表示 -a 的参数可选）。
     * @param longopts  长选项结构体数组，用于定义支持的长选项。
     *                  - 每个 struct option 表示一个长选项。
     *                  - 数组的最后一个元素必须全为零，表示结束。
     * @param longindex 如果非 NULL，函数会将当前找到的长选项在 longopts 数组中的索引存储到该指针指向的位置。
     *
     * @return 返回找到的选项字符（短选项/长选项）或 0（长选项）。
     *         - 如果找到短选项，返回短选项字符。
     *         - 如果找到长选项，返回 0。
     *         - 如果遇到未知选项，返回 '?'。
     *         - 如果遇到缺少参数的选项，返回 ':'。
     *         - 如果所有选项解析完毕，返回 -1。
     *
     * @note
     * - 短选项可以通过 -a 或 -a value 的形式传递。
     * - 长选项可以通过 --option 或 --option=value 的形式传递。
     * - 长选项结构体 struct option 的定义如下：
     *   struct option {
     *       const char *name;   // 长选项的名称（如 "help"）。
     *       int has_arg;        // 是否需要参数：
     *                           //   no_argument（0）：不需要参数。
     *                           //   required_argument（1）：需要参数。
     *                           //   optional_argument（2）：参数可选。
     *       int *flag;          // 如果为 NULL，getopt_long 返回 val 的值。
     *                           // 如果非 NULL，getopt_long 返回 0，并将 val 的值存储到 *flag。
     *       int val;            // 长选项的返回值（通常是一个字符）。
     *   };
     *
     */

    // 解析命令行参数
    while ((ch = getopt_long(argc, argv, "l", long_opts, NULL)) != -1) {
        switch (ch) {
            case 'l':
                printf("选项l\n");
                break;
            case 'v':
                printf("选项version\n");
                break;
            case 'h':
                printf("选项help\n");
                break;
            case '?':
                printf("Unknown option: %c\n", optopt);
                return 1;
            default:
                break;
        }
    }

    return 0;
}
